昨天我們講解了其中一種架構,也就是將單純的網頁放入nginx container,並將log往外拋,並且透過filebeat上傳到elastic cloud。今天我們同樣會先採用這個架構,講解透過docker-compose,去架構目前比較常見的某個語言後端(java-spring, python-flask,django)之類的,外面套上一個nginx,並且一樣將log往外拋,讓filebeat去上傳log到cloud上。
這邊講一下,docker-compose雖然不是本次分享重點,但為了讓大家比較知道在幹嘛,所以簡單介紹一下。
docker-compose,是docker將服務容器化後,有很多小的容器後,將彼此串聯在同一個網路架構下的一個做法,透過docker-compose,可以設置共享的volume以及網路架構,讓container之間可以有相依性以及溝通管道。因此可以想像成,透過compose,一次架構多個container,並定義彼此之間的關係。
docker-compose,通常是透過yaml檔案去設置,裡面會撰寫到要開啟幾個container,每一個container的設定,例如採用的DockerFile、volume,以及port相關設定。而他也可以定義彼此之間container的相依,也就是當要啟動compose的時候,不同container的先後順序;這部分可以想像為,有些服務是某個服務的前置,如果沒有定義可能無法有效的啟動。
flask是python的後端框架之一,主打的是輕量方便,因此透過一個py檔,就能定義好每個endpoint的view,也能夠在同一個script中建構model。而執行一個簡單flask py檔,可以直接透過python simple的HTTPSERVER去接收request,但這基本上若在production環境會不夠有效率,因此通常會通過uwsgi去作為接收reqeust並triger python view的作法。
前面講解完我們這次的兩個主角,這邊其實大家可以理解為,flask可以替換為任何的前後端框架;nginx也能夠替換為apache等等,主軸就是模擬一個實際在運作的container架構,我們能夠有效地收集log。
一、首先我們先將資料夾架構定義出來
其中包含: flask、nginx這兩個資料夾,裡面各會包含flask跟nginx的DockerFile。
首先是nginx的dockerfile,主要很簡單,就是將預設的conf檔案刪除 並且複製我們放在資料夾中的nginx.conf就行
nginx.conf
server {
listen 80;
# server_name 0.0.0.0;
location / {
include uwsgi_params;
uwsgi_pass flask:8080;
}
}
nginx DockerFile
# Use the Nginx image
FROM nginx
# Remove the default nginx.conf
RUN rm /etc/nginx/conf.d/default.conf
# Replace with our own nginx.conf
COPY nginx.conf /etc/nginx/conf.d/
flask DockerFile
FROM python:3.7.2-stretch
WORKDIR /app
ADD . /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
CMD ["uwsgi", "wsgi.ini"]
YAML檔案
version: '3.3'
services:
flask:
build: ./flask
container_name: template_flask
# restart: always
environment:
- APP_NAME=FlaskApp
expose:
- 8080
nginx:
build: ./nginx
volumes:
- "/c/Users/user/flask-nginx-elk-demo/nginx-logs:/var/log/nginx"
container_name: template_nginx
# restart: always
ports:
- "80:80"
depends_on:
- flask